nginx日志切割

        nginx 没有 apache自动切割的工具,只有写脚本,也可以借助 centos 自带的日志归档工具 logrotate 。

1.nginx 日志切割脚本

        首先确定访问日志路径,假定为 /tmp/axxess.log ,还要确定 nginx 的 pid 文件所在路径,假定为 /usr/local/nginx/var/nginx.pid。下面开始写日志

1
2
3
4
5
6
7
8
9
10
[root@lnmp ~]# vim /usr/local/sbin/nginx_logrotate.sh
#!/bin/bash
d=`data -d "-1 day" +%F`
[ -d /tmp/nginx_log ] || mkdir /tmp/nginx_log
mv /tmp/access.log /tmp/nginx_log/$d.log
/etc/init.d/nginx reload > /dev/null
cd /tmp/nginx_log/
gizp -f $d.log

        d=data -d "-1 day" +%F 表示时间,切割前一天的日志;

        [ -d /tmp/nginx_log ] || mkdir /tmp/nginx_log 判断归档目录存在不存在,存在就进行下一步,不存在就创建;

        mv /tmp/access.log /tmp/nginx_log/$d.log 把日志移动到归档目录,文件名$d根据时创建;

        /etc/init.d/nginx reload > /dev/null 移动日志以后需要重新创建access.log 重新加载 nginx 就可以,然后把重新加载的输出日志重定向到 /dec/null;

        cd /tmp/nginx_log/ 进入归档目录;

        cd /tmp/nginx_log/ 如果日志比较大,压缩归档文件方便保存,-f 表示强制覆盖。

        最后写一个计划任务,每天0点0分执行脚本。

1
2
3
[root@lnmp ~]# crontab -e
0 0 * * * /bin/bash /usr/local/sbin/nginx_logrotate.sh

2.借助系统的 logrotate 工具实现

1
[root@lnmp ~]# vim /etc/logrotate.d/nginx

        加入内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
/tmp/*.log {
Daily
Missingok
rotate 52
compress
delaycompress
notifempty
create 644 nobody nobody
sharedscripts
postrotate
[ -f /usr/local/nginx/var/nginx.pid ] && kill -USR1 `cat /usr/local/nginx/var/nginx.pid`
Endscript
}

        说明:

  • daily 表示日志按天归档;
  • missingok 表示忽略所有错误,比如日志文件不存在的情况下;
  • rotate 52 表示存放的日志个数,最多就52个,最老的会被删除;
  • compress 表示日志要压缩;
  • delaycopress 表示压缩除了当前和最近之外的所有其他版本;
  • notifempty 表示如果日志为空,则不归档;
  • create 644 nobody nobody 定义归档日志的权限以及属主和属组;
  • sharedscripts 表示所有的日志共享该脚本,因为这里指定的日志文件为多个,用来*.log;
  • portrotate 后边跟轮换过日志之后要运行的命令;
  • endscript 表示结束了。